import java.util.ArrayList;
/*
 * Rep. ein Lager voller Schachteln
 * Attribute:
 * --> Arralist Lager: rep. das eigentliche Lager
 * --> Sack S: rep. den Sack des Weihnachtsmannes
 */
public class SchachtelLager {

	private ArrayList<Schachtel> Lager;

	private Sack S;

	public SchachtelLager() {
		Lager = new ArrayList<Schachtel>();
		S = new Sack();
	}

	//Schachtel ins Lager legen
	public boolean add(Schachtel A) {
		return Lager.add(A);
	}
	
	//	Verpacke Geschenke bzw. Schachteln in Schachteln und verschieb sie in den Weihnachtssack
	//	Attribute: 
	//	-->boolean found: gibt an ob passende Schachtel gefunden
	public void verpacke(Gegenstand A) {

		boolean found = false;

		for (int i = 0; i < Lager.size(); i++) 
		{
			if(!(Lager.get(i).getInhalt() instanceof Schachtel))
			{
				// Quadrat in Quadrat
				if (A.getform() instanceof Quadrat) {
					if (Lager.get(i).getform() instanceof Quadrat)
						if (A.getform().getGrundflaeche() == Lager.get(i).getform().getGrundflaeche()) {
							Lager.get(i).setInhalt(A);
							found = true;
							A.setpre(Lager.get(i));
							break;
						}
				}
				// Kreis in Quadrat oder Kreis
				else if (A.getform() instanceof Kreis) {
					if (Lager.get(i).getform() instanceof Kreis) {
						if (A.getform().getGrundflaeche() == Lager.get(i).getform().getGrundflaeche()) {
							Lager.get(i).setInhalt(A);
							found = true;
							A.setpre(Lager.get(i));
							break;
						}
					} else if (Lager.get(i).getform() instanceof Quadrat) 
					{							
							// Kreis in Quadrat
							
							double d = 0; //Durchmesser des Kreises
							double b = 0; //Breite des Quadrats
							
							d = 2 * Math.sqrt(A.getform().getGrundflaeche() / Math.PI);
							b = Math.sqrt(Lager.get(i).getform().getGrundflaeche());
							
							if(d == b) // Kreis passt in Quadrat
							{
								Lager.get(i).setInhalt(A);
								found = true;
								A.setpre(Lager.get(i));
								break;
							}
					}
					
				}
				// Rechteck in Rechteck
				else if (A.getform() instanceof Rechteck) {
					if (Lager.get(i).getform() instanceof Rechteck) {
						if (A.getform().getGrundflaeche() == Lager.get(i).getform().getGrundflaeche()) {
							Lager.get(i).setInhalt(A);
							found = true;
							A.setpre(Lager.get(i));
							break;
						}
					}
				}
			}
		}
		//Falls Schachtel  nicht gefunden 
		//Erzeuge neue
		if (!found) {
			//System.out.println("Schachtel nicht gefunden--> erzeuge Schachtel");
			Schachtel new_S = new Schachtel(A.getform());
			new_S.setInhalt(A);
			A.setpre(new_S);
			Lager.add(new_S);
		}
		move();
	}
	
	//Gibt den WeihnachtsSack zurueck
	public Sack getSack() {
		return this.S;
	}
	
	//Verschiebt volle Parkette in den Sack
	private void move() 
	{
		Schachtel temp_element;
		Gegenstand inhalt;
		Schachtel pre;
		for(int i= 0;i<Lager.size();i++)
		{
			temp_element = Lager.get(i);
				inhalt = temp_element.getInhalt();
				pre = Lager.get(i).getpre();
				
			if(inhalt instanceof Geschenk)
			{
				//Wenn nur ein Geschenk in nur einer Schachtel
				if(pre == null)
				{
					if (S.add(temp_element)) 
						Lager.remove(temp_element);
				}
				else
				{
					//Wenn mehrer Schachten ineinanderstecken
					while(pre != null)
					{
						Lager.remove(temp_element);
						temp_element = pre;
						pre = pre.getpre();
						
					}
					if (S.add(temp_element)) 
						Lager.remove(temp_element);
				
				}
			}			
		}
	}
	
	//Gibt alle Schachteln im Lager zureuck
	public void schachteln() {
		System.out.println("\nim Lager:");
		for (int i = 0; i < Lager.size(); i++) {
			System.out.print(","+Lager.get(i).getform());
		}
		
	}
	

}
